<?php
namespace app\wechat\controller;
use think\Controller;
/**
 * 微信公众号URL地址：http://域名/wechat
 */

class IndexController extends Controller {

	protected function _initialize() {
		parent::_initialize();
		$echoStr = input('echostr');
		config('app_debug', false);
		config('app_trace', false);
		//随机字符串
		if ($this -> checkSignature()) {//调用类内部函数进行验证
			return input('echostr');
		}
	}

	public function index() {
		$mid = input('mid', 0);
		/* 创建接口操作对象 */
		$wechat = load_wechat('Receive');
		/* 验证接口 */
		if ($wechat -> valid() === FALSE) {
			// 退出程序
			exit($wechat -> errMsg);
		}
		/* 获取粉丝的openid */
		$openid = $wechat -> getRev() -> getRevFrom();
		/* 分别执行对应类型的操作 */
		switch ($wechat->getRev()->getRevType()) {
			// 文本类型处理
			case \WechatReceive::MSGTYPE_TEXT :
				$keys = $wechat -> getRevContent();
				return $this -> _keys($wechat, $keys, $mid);

			// 事件类型处理
			case \WechatReceive::MSGTYPE_EVENT :
				$event = $wechat -> getRevEvent();
				return $this -> _event($wechat, strtolower($event['event']));

			// 图片类型处理
			case \WechatReceive::MSGTYPE_IMAGE :
				return $this -> _image($wechat);

			// 发送位置类的处理
			case \WechatReceive::MSGTYPE_LOCATION :
				return $this -> _location($wechat);

			// 其它类型的处理，比如卡卷领取、卡卷转赠
			default :
				return $this -> _default($wechat);
		}
	}

	function _keys($wechat, $keys, $mid) {
		// 读取数据库关键字
		$replys = db('wechat_reply') -> where('key', $keys) -> where('mid', $mid) -> find();
		if ($replys) {
			switch ($replys['type']) {
				case 'text' :
					//回复文字
					return $wechat -> text($replys['content'] . '') -> reply();
					break;
				case 'image' :
					//回复图片
					return $wechat -> image($replys['image_id'] . '') -> reply();
					break;
				case 'news' :
					//回复图文消息
					return $wechat -> news(json_decode($replys['news'])) -> reply();
					break;
			}
		} else {
			return $wechat -> text('客官您说的什么！') -> reply();
		}
	}

	function _event($wechat, $event) {
		switch ($event) {
			// 粉丝关注事件
			case 'subscribe' :
				return $wechat -> text('终于等到你，还好没放弃！') -> reply();
			// 粉丝取消关注
			case 'unsubscribe' :
				exit("success");
			// 点击微信菜单的链接
			case 'click' :
				return $wechat -> text('你点了菜单链接！') -> reply();
			// 微信扫码推事件
			case 'scancode_push' :
			case 'scancode_waitmsg' :
				$scanInfo = $wechat -> getRev() -> getRevScanInfo();
				return $wechat -> text("你扫码的内容是:{$scanInfo['ScanResult']}") -> reply();
			// 扫码关注公众号事件（一般用来做分销）
			case 'scan' :
				return $wechat -> text('终于等到你，还好没放弃！！') -> reply();
		}
	}

	function _image($wechat) {
		// $wechat 中有获取图片的方法
		return $wechat -> text('您发送了一张图片过来') -> reply();
	}

	function _location($wechat) {
		// 这里直接原样回复给微信(当然你需要根据业务需求来定制的)
		return $wechat -> text('您发送了您的定位哦') -> reply();
	}

	function _default($wechat) {
		// 这里直接原样回复给微信(当然你需要根据业务需求来定制的)
		return $wechat -> text('小编不懂您要干么事') -> reply();
	}

	//微信验证方法
	private function checkSignature() {
		//微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
		$signature = input('signature');
		$timestamp = input('timestamp');
		//时间戳
		$nonce = input('nonce');
		//随机数
		$token = config('token');
		//设置自定义的token 这里的配置要和微信公众平台上面的配置是一样的
		$tmpArr = array($token, $timestamp, $nonce);
		sort($tmpArr, SORT_STRING);
		//将数组进行排序
		$tmpStr = implode($tmpArr);
		//将数组分割成字符串
		$tmpStr = sha1($tmpStr);
		//计算字符串 SHA-1 散列
		if ($tmpStr == $signature) {//判断微信的加密签名和我们组装的sha加密字符串是否相等。
			return true;
		} else {
			return false;
		}
	}

}
